/**
 * @author zephyr
 * @last-modified 2011.10.30
 * @version 1.0
 */
package com.zpyr.common.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.zpyr.common.LogManager;

public class DBManager {
	
	private String jndi_name;
	protected LogManager logger = new LogManager();
	public DataSource dbLoading( DataSource ds ) {
		try {
			jndi_name = "jdbc/zpyr";
			Context initContext = new InitialContext();
			Context envContext  = (Context)initContext.lookup("java:/comp/env");
			ds = (DataSource)envContext.lookup( jndi_name );
			return ds;
		} catch (NamingException e) {
			logger.debug(e.toString() + ", tomcat server.xml 에서 "+jndi_name+" 을 확인하세요.");
			return null;
		}
	}
	
	
	/*****************************************************
	 * @param sql
	 * @return 결과가 0개이거나 데이터가 없으면 null을 리턴한다.
	 *****************************************************/
	public ResultSet select(String sql) {
		Connection conn = null;
		DataSource ds = null;
		ds = dbLoading( ds );
		if(ds == null) {
			logger.debug("DB에 연결되어있지 않습니다.");
			return null;
		}
		try {
			conn = ds.getConnection("OCPEK2" , "ql1010al");
			// 2,3번째 파라미터는 rs.last() 등의 함수를 자유롭게 사용하기 위해서 사용.
			PreparedStatement pstmt = conn.prepareStatement(sql , ResultSet.TYPE_SCROLL_SENSITIVE , ResultSet.CONCUR_READ_ONLY);
			ResultSet rs = pstmt.executeQuery();
			logger.debug("===실행된 쿼리===\r\n");
			logger.debug(sql);
			logger.debug("===============");
			rs.last();
			if( rs.getRow() == 0 ) return null;
			rs.beforeFirst();
			return rs;
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			}
			catch(Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	public ResultSet select2(String sql) {
		Connection conn = null;
		DataSource ds = null;
		ds = dbLoading( ds );
		if(ds == null) {
			logger.debug("DB에 연결되어있지 않습니다.");
			return null;
		}
		try {
			conn = ds.getConnection();
			// 2,3번째 파라미터는 rs.last() 등의 함수를 자유롭게 사용하기 위해서 사용.
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			logger.debug("===실행된 쿼리===\r\n");
			logger.debug(sql);
			logger.debug("===============");
			return rs;
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			}
			catch(Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	
	/******************************************************
	 * INSERT , UPDATE , DELETE 쿼리를 사용한다.
	 * @param sql
	 * @return 양수 : INSERT , UPDATE , DELETE된 갯수 , 0 : INSERT , UPDATE , DELETE 실패
	 */
	public int execute(String sql) {
		int retCnt = 0;
		Connection conn = null;
		DataSource ds = null;
		ds = dbLoading( ds );
		if(ds == null) {
			logger.debug("DB에 연결되어있지 않습니다.");
			return 0;
		}
		try {
			
			conn = ds.getConnection();
			
			PreparedStatement pstmt = conn.prepareStatement(sql);
			retCnt = pstmt.executeUpdate();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			}
			catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return retCnt;
	}
}
